<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="Content-Style-Type" content="text/css" />
  <meta name="generator" content="pandoc" />
  <title></title>
  <style type="text/css">code{white-space: pre;}</style>
  <style type="text/css">
  @page {
      @bottom {
          content: counter(page) "/" counter(pages)
      }
  }
  
  @page { margin: 30pt 20pt 30pt 20pt }
  
  body {
     font-family: Helvetica, arial, freesans, clean, sans-serif;
     font-size: 14px;
     line-height: 1.6;
     padding-top: 10px;
     padding-bottom: 10px;
     background-color: white;
     padding: 30px; }
  
  body > *:first-child {
     margin-top: 0 !important; }
  body > *:last-child {
     margin-bottom: 0 !important; }
  
  a {
     color: #4183C4; }
  a.absent {
     color: #cc0000; }
  a.anchor {
     display: block;
     padding-left: 30px;
     margin-left: -30px;
     cursor: pointer;
     position: absolute;
     top: 0;
     left: 0;
     bottom: 0; }
  
  h1, h2, h3, h4, h5, h6 {
     margin: 20px 0 10px;
     padding: 0;
     font-weight: bold;
     -webkit-font-smoothing: antialiased;
     cursor: text;
     position: relative; }
  
  h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
     text-decoration: none; }
  
  h1 tt, h1 code {
     font-size: inherit; }
  
  h2 tt, h2 code {
     font-size: inherit; }
  
  h3 tt, h3 code {
     font-size: inherit; }
  
  h4 tt, h4 code {
     font-size: inherit; }
  
  h5 tt, h5 code {
     font-size: inherit; }
  
  h6 tt, h6 code {
     font-size: inherit; }
  
  h1 {
     font-size: 28px;
     color: black; }
  
  h2 {
     font-size: 24px;
     border-bottom: 1px solid #cccccc;
     color: black; }
  
  h3 {
     font-size: 18px; }
  
  h4 {
     font-size: 16px; }
  
  h5 {
     font-size: 14px; }
  
  h6 {
     color: #777777;
     font-size: 14px; }
  
  p, blockquote, ul, ol, dl, li, table, pre {
     margin: 15px 0; }
  
  hr {
     border: 0 none;
     color: #cccccc;
     height: 4px;
     padding: 0;
  }
  
  body > h2:first-child {
     margin-top: 0;
     padding-top: 0; }
  body > h1:first-child {
     margin-top: 0;
     padding-top: 0; }
  body > h1:first-child + h2 {
     margin-top: 0;
     padding-top: 0; }
  body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {
     margin-top: 0;
     padding-top: 0; }
  
  a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
     margin-top: 0;
     padding-top: 0; }
  
  h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
     margin-top: 0; }
  
  li p.first {
     display: inline-block; }
  li {
     margin: 0; }
  ul, ol {
     padding-left: 30px; }
  
  ul :first-child, ol :first-child {
     margin-top: 0; }
  
  dl {
     padding: 0; }
  dl dt {
     font-size: 14px;
     font-weight: bold;
     font-style: italic;
     padding: 0;
     margin: 15px 0 5px; }
  dl dt:first-child {
     padding: 0; }
  dl dt > :first-child {
     margin-top: 0; }
  dl dt > :last-child {
     margin-bottom: 0; }
  dl dd {
     margin: 0 0 15px;
     padding: 0 15px; }
  dl dd > :first-child {
     margin-top: 0; }
  dl dd > :last-child {
     margin-bottom: 0; }
  
  blockquote {
     border-left: 4px solid #dddddd;
     padding: 0 15px;
     color: #777777; }
  blockquote > :first-child {
     margin-top: 0; }
  blockquote > :last-child {
     margin-bottom: 0; }
  
  /*
  table {
     padding: 0;border-collapse: collapse; }
  table tr {
     border-top: 1px solid #cccccc;
     background-color: white;
     margin: 0;
     padding: 0; }
  table tr:nth-child(2n) {
     background-color: #f8f8f8;
     }
  table tr th {
     font-weight: bold;
     border: 1px solid #cccccc;
     margin: 0;
     padding: 6px 13px; }
  table tr td {
     border: 1px solid #cccccc;
     margin: 0;
     padding: 6px 13px; }
  table tr th :first-child, table tr td :first-child {
     margin-top: 0; }
  table tr th :last-child, table tr td :last-child {
     margin-bottom: 0; }
  
  */
  
  /* table */
  
  table {
      /*width: 100%;*/
  	border-top: 1px solid #919699;
  	border-left: 1px solid #919699;
  	border-spacing: 0;
  }
  	
  table th {
  	padding: 4px 8px 4px 8px;
  	background: #E2E2E2;
  	font-size: 12px;
  	border-bottom: 1px solid #919699;
  	border-right: 1px solid #919699;
  }
  table th p {
  	font-weight: bold;
  	margin-bottom: 0px; 
  }
  	
  table td {
  	padding: 8px;
  	font-size: 12px;
  	vertical-align: top;
  	border-bottom: 1px solid #919699;
  	border-right: 1px solid #919699;
  }
  table td p {
  	margin-bottom: 0px; 
  }
  table td p + p  {
  	margin-top: 5px; 
  }
  table td p + p + p {
  	margin-top: 5px; 
  }
  
  
  
  img {
     max-width: 100%; }
  
  span.frame {
     display: block;
     overflow: hidden; }
  span.frame > span {
     border: 1px solid #dddddd;
     display: block;
     float: left;
     overflow: hidden;
     margin: 13px 0 0;
     padding: 7px;
     width: auto; }
  span.frame span img {
     display: block;
     float: left; }
  span.frame span span {
     clear: both;
     color: #333333;
     display: block;
     padding: 5px 0 0; }
  span.align-center {
     display: block;
     overflow: hidden;
     clear: both; }
  span.align-center > span {
     display: block;
     overflow: hidden;
     margin: 13px auto 0;
     text-align: center; }
  span.align-center span img {
     margin: 0 auto;
     text-align: center; }
  span.align-right {
     display: block;
     overflow: hidden;
     clear: both; }
  span.align-right > span {
     display: block;
     overflow: hidden;
     margin: 13px 0 0;
     text-align: right; }
  span.align-right span img {
     margin: 0;
     text-align: right; }
  span.float-left {
     display: block;
     margin-right: 13px;
     overflow: hidden;
     float: left; }
  span.float-left span {
     margin: 13px 0 0; }
  span.float-right {
     display: block;
     margin-left: 13px;
     overflow: hidden;
     float: right; }
  span.float-right > span {
     display: block;
     overflow: hidden;
     margin: 13px auto 0;
     text-align: right; }
  
  code, tt {
     margin: 0 2px;
     padding: 0 5px;
     white-space: nowrap;
     border: 1px solid #eaeaea;
     background-color: #f8f8f8;
     border-radius: 3px; }
  
  pre code {
     margin: 0;
     padding: 0;
     white-space: pre;
     border: none;
     background: transparent;
  }
  
  .highlight pre {
     background-color: #f8f8f8;
     border: 1px solid #cccccc;
     font-size: 13px;
     line-height: 19px;
     overflow: auto;
     padding: 6px 10px;
     border-radius: 3px; }
  
  pre {
     background-color: #f8f8f8;
     border: 1px solid #cccccc;
     font-size: 13px;
     line-height: 19px;
     overflow: auto;
     padding: 6px 10px;
     border-radius: 3px; }
  pre code, pre tt {
     font-family: Consolas, "Liberation Mono", Courier, monospace;
     background-color: transparent;
     border: none; }
  
  sup {
     font-size: 0.83em;
     vertical-align: super;
     line-height: 0;
  }
  * {
  	 -webkit-print-color-adjust: exact;
  }
  @media screen and (min-width: 914px) {
     body {
        width: 854px;
        margin:0 auto;
     }
  }
  @media print {
  	 table, pre {
  		  page-break-inside: avoid;
  	 }
  	 pre {
  		  word-wrap: break-word;
  	 }
  }
  </style>
</head>
<body>
<h1 id="cc视频-android-sdk-使用说明">CC视频 Android SDK 使用说明</h1>
<p>版本：2.3.13 <br/> 日期：2015-12-23</p>
<p><br/><br/><br/></p>
<h2 id="概述">1. 概述</h2>
<p><br/></p>
<p><strong>CC视频Android SDK</strong>是基于Android API实现的类库，支持Android2.3及以上版本，开发者可通过此SDK对接CC视频云服务平台，进行播放、上传和下载操作。</p>
<p><br/></p>
<h2 id="如何使用sdk">2. 如何使用SDK</h2>
<p><br/></p>
<p>CC视频2.0版Android SDK包提供了以下文件：</p>
<ul>
<li>CCSDK.jar，是集成SDK播放、上传和下载等功能的类库；</li>
<li>sdk_guide，是SDK的使用指南；</li>
<li>ccsdkdemo，是使用SDK对接CC视频云服务的示例源码，支持Android4.0及以上版本；</li>
<li>sdk_doc，是描述SDK内部接口信息的文档。</li>
</ul>
<p>为确保SDK可正常使用，请按照以下操作配置项目环境：</p>
<h5 id="将ccsdk.jar添加到android项目中并配置当前项目可正确的引用此类库">1. 将CCSDK.jar添加到Android项目中，并配置当前项目可正确的引用此类库。</h5>
<h5 id="配置项目的网络权限和文件读写权限">2. 配置项目的网络权限和文件读写权限：</h5>
<pre><code>&lt;!-- 用于网络通信 --&gt;
&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;
&lt;!-- 用于存储已下载文件 --&gt;
&lt;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot; /&gt;</code></pre>
<h5 id="ccsdk.jar已经过混淆处理如果需要对应用进行混淆编译请在混淆的配置文件中加入以下代码以避免sdk被二次混淆编译">3. CCSDK.jar已经过混淆处理，如果需要对应用进行混淆编译，请在混淆的配置文件中加入以下代码，以避免SDK被二次混淆编译。</h5>
<pre><code>-dontwarn com.bokecc.sdk.mobile.**
-keep public class com.bokecc.sdk.mobile.**{*;}
-keep public interface com.bokecc.sdk.mobile.**{*;}</code></pre>
<h3 id="视频播放">2.1 视频播放</h3>
<p>SDK视频播放由DWMediaPlayer类实现，DWMediaPlayer继承了Android的媒体播放器MediaPlayer类，并重载其prepare()和prepareAsync()方法。</p>
<p>使用DWMediaPlayer既可播放CC视频云服务平台下的视频（以下简称在线播放），也可播放本地视频。</p>
<h4 id="在线播放">2.1.1 在线播放</h4>
<p>使用SDK的在线播放功能时，仅需设置视频ID、账户ID、API KEY及Context（上下文信息）即可播放云端视频。具体实现方式如下：</p>
<pre><code>String videoId =&quot;123456&quot;; 
Context context = getApplicationContext();
DWMediaPlayer player = new DWMediaPlayer();

// 设置视频播放信息
player.setVideoPlayInfo(videoId, &quot;USERID&quot;, &quot;API_KEY&quot;, context);
player.prepareAsync();</code></pre>
<p>当播放器准备播放完成后，调用start()方法开始播放视频。同时，DWMediaPlayer提供了getVideoStatusInfo（获取视频状态），getVideoTitle（获取视频标题）等方法，开发者可根据需要在应用中展示相应的信息。</p>
<h5 id="选择清晰度播放">选择清晰度播放</h5>
<p>DWMediaPlayer提供了getDefinitions()方法获取当前播放的视频清晰度列表。如果需要切换视频的清晰度，可根据当前视频的清晰度对DWMediaPlayer进行设置。具体实现方式如下，</p>
<pre><code>// 获取清晰度列表
Map&lt;String, Integer&gt; definitions = player.getDefinitions();
// 获取某种清晰度对应的状态码
int definitionCode = definitions.get(&quot;definitionInfo&quot;);
// 设置播放清晰度
player.setDefinition(context, definitionCode);</code></pre>
<h4 id="本地播放">2.1.3 本地播放</h4>
<p>在使用DWMediaPlayer播放本地视频时，与使用Android默认媒体播放器MediaPlayer播放本地视频的方法相同，仅需设置视频文件地址。具体实现方式如下，</p>
<pre><code>String path = &quot;/123456.MP4&quot;;
DWMediaPlayer player = new DWMediaPlayer();

//设置视频文件地址
player.setDataSource(path);
player.prepare();</code></pre>
<p>当播放器准备完成后，调用start()方法即可开始播放视频。</p>
<h4 id="错误处理">2.1.4 错误处理</h4>
<p>DWMediaPlayer重载了MediaPlayer的setOnErrorListener()方法，如果需要在应用中提示错误信息，可调用此方法设置OnErrorListener。具体实现方式如下，</p>
<pre><code>private OnErrorListener onErrorListener = new OnErrorListener() {
    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        
        //TODO 处理错误信息
        
        return false;
    }
};

player.setOnErrorListener(onErrorListener);</code></pre>
<h3 id="视频上传">2.2 视频上传</h3>
<p>SDK视频上传由Uploader类实现，Uploader通过HTTP协议与服务端进行通信，上传视频信息和视频文件。同时，SDK提供了上传回调接口UploadListener来监听视频上传流程，如果需要在应用中展示上传状态、上传进度等信息，可根据需要进行设置。</p>
<h5 id="uploader使用示例">2.2.1 Uploader使用示例</h5>
<p>使用Uploader上传前，请先了解Uploader的工作流程：</p>
<ol style="list-style-type: decimal">
<li>创建Uploader实例，初始化视频信息，此时Uploader进入等待状态（<strong>WAIT</strong>）。</li>
<li>当需要开始上传时，调用start()方法开始上传，此时Uploader进入上传状态（<strong>UPLOAD</strong>）。</li>
<li>当需要暂停上传时，调用pause()方法。另外，在上传过程中可能出现网络异常问题，当出现此问题时，Uploader默认会暂停当前上传操作，进入暂停状态（<strong>PAUSE</strong>）。</li>
<li>当需要恢复上传时，调用resume()方法，若无网络异常等问题，此时Uploader会重新上传视频文件。</li>
<li>当需要取消上作时，调用cancel()方法，此时Uploader会进入等待状态（<strong>WAIT</strong>）。</li>
</ol>
<p>创建Uploader实例需提供<strong>VideoInfo</strong>（视频信息）和 API KEY，使用示例如下：</p>
<pre><code>VideoInfo videoInfo = new VideoInfo();
videoInfo.setTitle(&quot;title&quot;);
videoInfo.setTags(&quot;tag&quot;);
videoInfo.setDescription(&quot;description&quot;); 
 
// 设置视频文件地址
videoInfo.setFilePath(&quot;filePath&quot;);
// 设置账号信息
videoInfo.setUserId(&quot;USERID&quot;
// 设置回调信息
videoInfo.setNotifyUrl(“NOTIFY_URL&quot;);

Uploader uploader = new Uploader(videoInfo,&quot;API_KEY&quot;);

// 开始上传
uploader.start();</code></pre>
<p><strong>VideoInfo</strong>是用来记录上传过程与视频相关的信息，具体介绍请参考sdk_doc，在初始化视频信息时，服务端需根据视频的标题、标签、描述等来创建视频，所以在使用VideoInfo创建Uploader实例时，请确保视频信息非空。</p>
<p><strong>v2.3.4新增：</strong>新增disconnectRequest()方法，可以立刻停止当前url请求，该方法需配合pause()和cancel()方法来使用。</p>
<h4 id="设置上传回调">2.2.2 设置上传回调</h4>
<p>Uploader在执行上传操作时，默认会检查是否设置了UploadListener。若已设置UploadListener，Uploader会回调UploadListener已实现的方法；若未设置，则不回调任何信息。UploadListener具体使用方法如下：</p>
<pre><code>UploadListener uploadListener = new UploadListener(){

    @Override
    public void handleProcess(long range, long size, String videoId) {
        // TODO 处理上传进度
    }

    @Override
    public void handleException(DreamwinException exception, int status) {
        // TODO 处理上传过程中出现的异常
    }

    @Override
    public void handleStatus(VideoInfo videoInfo, int status) {
        // TODO 处理上传回调的视频信息及上传状态    
    }

    @Override
    public void handleCancel(String videoId) {
        // TODO 处理取消上传的后续操作    
    }
};

uploader.setUploadListener(uploadListenner);</code></pre>
<h3 id="视频下载">2.3 视频下载</h3>
<p>SDK视频下载由Downloader类实现的，Downloader通过HTTP协议与服务端进行通信，获取视频下载地址。同时，SDK提供了下载回调接口DownloadListener来监听视频下载流程，如果需要向用户展示下载状态、下载进度等信息，可根据需要进行设置。</p>
<h4 id="downloader使用示例">2.3.1 Downloader使用示例</h4>
<p>在使用Downloader前，请先了解Downloader的工作流程：</p>
<ol style="list-style-type: decimal">
<li>创建Downloader实例，初始化视频文件下载信息，此时Downloader进入等待状态（<strong>WAIT</strong>）。</li>
<li>当需要开始下载时，调用start()方法，此时Downloader进入下载状态（<strong>DOWNLOAD</strong>）。</li>
<li>当需要暂停下载时，调用pause()方法。另外，在下载过程中可能出现网络异常问题，当出现此问题时，Downloader默认会暂停下载操作，进入暂停状态（<strong>PAUSE</strong>）。</li>
<li>当需要恢复下载时，调用resume()方法。若无网络异常等问题，此时Downloader会重新下载视频文件。</li>
<li>当需要取消视频下载时，调用cancel()方法，此时Downloader会进入等待状态（<strong>WAIT</strong>）。</li>
</ol>
<p>创建Downloader实例需提供视频存储文件，视频ID，账户ID和API KEY。示例如下：</p>
<pre><code>File file = new File(&quot;/123456.MP4&quot;);
String videoId =&quot;123456&quot;;
Downloader downloader = new Downloader(file, videoId,&quot;USERID&quot;,&quot;API_KEY&quot;);

// 开始下载
downloader.start();</code></pre>
<p>SDK视频下载需指定文件存储路径，所以在创建Downloader实例时，请提供正确的文件存储路径。</p>
<h4 id="设置下载回调">2.3.2 设置下载回调</h4>
<p>Downloader在执行下载操作时，默认会检查是否设置了DownloadListener。若已设置DownloadListener，Downloader会回调DownloadListener接口已实现的方法；若未设置，则不回调任何信息。DownloadListener使用方法如下：</p>
<pre><code>DownloadListener downloadListener = new DownloadListener(){
    @Override
    public void handleProcess(long start, long end, String videoId) {
        // TODO 处理下载进度
    }

    @Override
    public void handleException(DreamwinException exception, int status) {
        // TODO 处理下载过程中发生的异常信息        
    }

    @Override
    public void handleStatus(String videoId, int status) {
        // TODO 处理视频下载信息及相应状态
    }

    @Override
    public void handleCancel(String videoId) {
        // TODO 处理取消下载的后续操作
    }
};

downloader.setDownloadListener(downloadListener);</code></pre>
<h4 id="选择清晰度下载">2.3.3 选择清晰度下载</h4>
<p>流程如下：</p>
<ol style="list-style-type: decimal">
<li>创建Downloader实例；</li>
<li>调用setOnProcessDefinitionListener()方式设置清晰度回调；</li>
<li>调用getDefinitionMap()方法获取清晰度；</li>
<li>根据获取的清晰度，调用setDownloadDefinition()方法设置想要的清晰度；</li>
<li>调用start()下载指定清晰度。</li>
</ol>
<p>获取清晰度时需实现OnProcessDefinitionListener接口的onProcessDefinition()方法，并调用Downloader的setOnProcessDefinitionListener()方法设置获取清晰度回调，获取清晰度的示例如下：</p>
<pre><code>class DownloadDemo{
    private HashMap&lt;Integer, String&gt; dm;
    private Downlaoder downloader;

    private OnProcessDefinitionListener onProcessDefinitionListener = new OnProcessDefinitionListener(){
        @Override
        public void onProcessDefinition(HashMap&lt;Integer, String&gt; definitionMap) {
            if(definitionMap != null){
                dm = definitionMap;
            } else {
                Log.e(&quot;get definition error&quot;, &quot;视频清晰度获取失败&quot;);
            }
        }

        @Override
        public void onProcessException(DreamwinException exception) {
            Log.i(&quot;get definition exception&quot;, exception.getErrorCode().Value());
        }

    };
    
    private getDefinition(){
        downloader.setOnProcessDefinitionListener(onProcessDefinitionListener);
        downloader.getDefinitionMap();
    }
    ……

}</code></pre>
<h4 id="设置下载重试次数">2.3.4 设置下载重试次数</h4>
<pre><code>//设置下载重试次数，默认为0，可设置区间[0, 100]
setReconnectLimit(int reconnectLimit)</code></pre>
<h4 id="设置超时时间">2.3.5 设置超时时间</h4>
<pre><code>//设置网络请求的超时时间,区间[5000-30000]，单位为ms，默认值为10000ms
setTimeOut(int timeOut)</code></pre>
<p><br/></p>
<h2 id="如何更好的使用sdk-demo">3. 如何更好的使用SDK Demo？</h2>
<p><br/></p>
<p>SDK Demo是使用SDK对接CC视频云服务的示例源码，目前支持Android4.0及以上版本。Demo的设计旨在展示SDK各项功能的使用方法，如果希望应用获得更好的使用体验，可根据需求自行更改。</p>
<h3 id="准备">3.1 准备</h3>
<p>在编译安装Demo前，请按照以下操作进行配置：</p>
<ol style="list-style-type: decimal">
<li><p>设置帐户信息，在ConfigUtil类中配置USERID（帐户ID）和API KEY。</p>
<pre><code>public final static String API_KEY = &quot;API KEY&quot;;
public final static String USERID = &quot;123456&quot;;</code></pre></li>
<li><p>添加播放列表，在PlayFragment类中配置playVideoIds（可播放的视频ID）。</p>
<pre><code>//TODO 待播放视频ID列表，可根据需求自定义
private String[] playVideoIds = new String[] {
    &quot;123456&quot;,
    &quot;234567&quot;,
    &quot;345678&quot;, 
    &quot;111111&quot;};</code></pre></li>
<li><p>添加下载列表，在DownloadFragment类中配置downloadVideoIds（可下载的视频ID）。</p>
<pre><code>//TODO 待下载视频ID，可根据需求自定义
private String[] downloadVideoIds = new String[] {
    &quot;123456&quot;,
    &quot;234567&quot;,
    &quot;345678&quot;, 
    &quot;111111&quot;};</code></pre></li>
</ol>
<p><br /></p>
<h3 id="功能模块简介">3.2 功能模块简介</h3>
<p>Demo包含播放、上传和下载三个功能模块：</p>
<ul>
<li><p>播放模块，展示了在线播放，屏幕缩放，清晰度切换，字幕等功能，具体实现请参考PlayFragment及MediaPlayActivity类。</p></li>
<li><p>上传模块，展示了视频上传的处理流程，及如何使用SDK进行后台上传，具体实现请参考UploadFragment及UploadService类。</p></li>
<li><p>下载模块，展示了视频下载的处理流程，及如何使用SDK进行后台下载，具体实现请参考DownloadFragment及DownloadService类。</p></li>
</ul>
<p><br/></p>
<h2 id="功能调试和问题反馈">4. 功能调试和问题反馈</h2>
<p><br/></p>
<h3 id="辅助调试工具">4.1 辅助调试工具</h3>
<p>SDK提供HTTP通信日志调试功能。在使用SDK进行播放、上传、下载过程中，如果遇到与网络通信相关的问题，可通过设置HTTP日志的级别获取通信信息。使用示例如下：</p>
<pre><code>// 设置HTTP通信日志级别
HttpUtil.LOG_LEVEL = HttpLogLevel.DETAIL;</code></pre>
<p>默认日志级别为GENERAL（记录HTTP通信发⽣生时间、响应状态码）。</p>
<h3 id="faq">4.2 FAQ</h3>
<h5 id="q无法播放视频">Q：无法播放视频</h5>
<pre><code>1. 检查已配置的帐户是否开通移动端播放权限      
2. 根据HTTP通信日志，排查网络问题
3. 检查视频状态是否正常</code></pre>
<h5 id="q上传视频出现异常">Q：上传视频出现异常</h5>
<pre><code>1. 检查已配置的帐户是否开通了客户端上传权限
2. 根据HTTP通信日志，排查网络问题</code></pre>
<h5 id="q下载视频出现异常">Q：下载视频出现异常</h5>
<pre><code>1. 检查已配置的帐户是否开通了移动端权限
2. 根据HTTP通信日志，排查网络问题
3. 检查视频状态是否正常</code></pre>
<p>更多信息请参考CC视频<a href="http://dev.bokecc.com">开发者支持</a>网站，如果在使用SDK过程中遇到其他问题请联系CC客服进行反馈</p>
</body>
</html>
